package 反射;

import java.lang.reflect.Constructor;
import java.util.concurrent.Callable;

/**
 * @author shy_black
 * @date 2019/3/18 16:12
 * @Description: 反射：
 * 取得包名 getPacka ge()
 * 取得父类信息getSuperClass()
 * 取得所有父接口getInterfaces()
 * 取得构造方法，普通方法，普通属性
 * <p>
 * 拿到一个类的class对象
 * 1.对象.getClass()
 * 2.类名称.class
 * 3.Class.forName(类全名称)
 *
 * public T newInstance():使用该类中的无参构造进行对象的创建如果类中没有无参构造，或权限不是public
 * 此方法无法使用
 *
 * Constructor：构造方法
 * * 取得所有构造方法
 * getConstructors()只能取得public权限的构造方法
 * getDeclaredConstructors()取得所有构造方法，与权限无关
 * 取得指定参数的构造方法，
 * getConstructor(参数)：只能取得该参数public权限的构造方法
 * getDeclaredConstructors(参数)取得该参数所有构造方法，与权限无关
 * <p>
 * 创建新对象：Constructor类提供的newInstance(Object ... args)
 * <p>
 * <p>
 * method：普通方法
 * 取得所有方法：
 * public Method[] getMethods() throws SecurityException
 * 取得本类以及父类中所有权限为public的普通方法（包括静态方法）
 * public Method[] getDeclaredMethods() throws SecurityException {
 * 只能取得本类中所有方法（包括private方法）
 * 反射调用普通方法：
 * public Object invoke(Object obj,Object... args)
 * <p>
 * <p>
 * field:普通属性
 * 设置属性值，obj-->实例化对象，value-->要设置的值
 * public void set(Object obj,Object value)
 * <p>
 * 取得属性值，obj-->实例化对象
 * public void get(Object obj)
 * <p>
 * 取得属性类型
 * public Class<?> getType()
 *
 *
 *
 * 动态破坏封装特性--->仅在一次JVM进程中有效
 * public void setAccessible(boolean flag) throws Exception
 */

public class test {
    public static void main(String[] args) throws Exception {
        Class<person> cls = person.class;
        Constructor constructor = cls.getDeclaredConstructor(String.class, int.class);
        //Constructor constructor1 = cls.getDeclaredConstructors();

        constructor.setAccessible(true);
        person per = (person) constructor.newInstance("shy_black", 18);
        System.out.println(per);


    }


}

class MyClass implements Runnable, Callable {
    @Override
    public void run() {

    }

    @Override
    public Object call() throws Exception {
        return null;
    }
}

class person {
    private String name;
    private int age;

    private person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

